#include <iostream>
#include<stdint.h>
#include<stdio.h>
#include <iostream>
#include <unordered_set>

using namespace std;

const uint8_t const_utf8_tag = 1, const_integer_tag = 3, const_float_tag = 4,
const_long_tag = 5,const_double_tag = 6, const_class_tag = 7, const_string_tag = 8,
const_fieldref_tag = 9, const_methodref_tag = 10, const_interfaceMethodref_tag = 11,
const_nameAndType_tag = 12,const_MethodHandle_tag = 15, const_methodType_tag = 16,
const_InvokeDynamic_tag = 18;

const char* constant_tag_str[20];

const string* attr_code_str , *attr_constantVal_str,
*attr_deprecated_str , *attr_exceptions_str,
*attr_innerClasses_str , *attr_lineNumberTable_str,
*attr_localVariableTable_str , *attr_sourceFile_str,
*attr_synthetic_str ;



enum attr_type {t_exception, t_code, t_lineNumberTable, t_constantValueAttr, t_innerClass, t_deprecated, t_synthetic};




unordered_set<string>* str_pool;
const string* NewOrFindString(const string&);
class ClassIter;


class ClassDefinition;
class MethodInfo;

class AttributeInfo;
class ExceptionAttr;
class ExceptionInfo;
class CodeAttr;
class LineNumberInfo;
class LineNumberTable;
class ConstantValueAttr;
class InnerClassesInfo;
class InnerClassesAttr;
class DeprecatedAttr;
class SyntheticAttr;
AttributeInfo* parseAttribute(ClassIter *, ClassDefinition*);


class ConstantInfo;
class ConstantUtf8Info;
class ConstantIntegerInfo;
class ConstantFloatInfo;

